package inherit;

/**
 * @author : niu niu
 * @version : 1.0.0
 * @date : 2022/9/9 21:26
 * 继承：将若干个不同的类之间相同的属性和方法抽象成一个共同的父类，子类只需要扩展自己类中独有的方法属性即可
 *          实现代码的复用
 *      要想使用继承，要发生继承的类之间必须满足is a 原则
 *
 *      使用extends关键字表示继承父类，父类中所有的非私有属性和方法会被子类继承下来
 *
 * 使用规则：
 *      1.在java中类的继承是单继承，只能继承一个父类，不可以多重继承，但是可以多层继承，一般多层继承不超过3层
 *      2.关于隐式继承 和 显示继承
 *          隐式继承：父类 的某些属性方法，子类继承下来，但是无法直接使用 private
 *          显示继承：随心所欲的使用    public
 *
 *  访问父类的属性和方法：
 *      1.访问父类的属性：子类想直接访问父类，父类属性 权限大于等于protect
 *              若显示继承，使用父类的属性，可以直接使用（子类中没有和父类同名的属性）
 *              若有同名，无关属性，就近匹配子类中的属性，子类覆盖掉父类的同名属性
 *              此时需要使用super关键字  super.父类属性
 *      2.访问父类的方法：
 *              命名不冲突的直接调用
 *              命名相同的方法：
 * -----------------------方法重写：发生在有继承关系的类之间，子类定义了和父类除了权限不同以外其他全部相同
 *                                                      （名称，参数列表，返回值）的方法，称之为方法的重写
 *                        子类重写后的方法权限>=父类权限
 *
 *                  要在子类中调用被覆写的父类方法，使用super.方法（）
 *
 *   关于父子类对象的产生：先父后子
 *          先调用父类的构造方法，产生父类对象，再调用子类构造方法，产生子类对象
 *
 *    3.super调用父类的构造方法
 *      a.若调用的父类的无参构造，可以不写
 *      b.若调用的父类的有参构造，需要显示的使用super（参数列表）调用
 *          i.在子类中使用 super 调用父类的构造方法，必须要放在首行
 *          ii.this和super表示构造方法调用时，不能同时存在
 *
 *    4.this,super区别
 *      this可以表示当前对象的引用，但是super只能调用父类的属性和方法
 */
public class Test {
    public static void main(String[] args) {
        Dog dog  = new Dog();
        dog.age = 10;
        dog.name="66";
        dog.weight=1.2;
        Cat cat  =new Cat();
        cat.age=10;
        cat.name="miao";
        cat.weight=1.2;
        cat.bark();
        dog.bark();
        cat.eat("猫粮");


    }
}
